package com.dfzt.myutils.personal;

import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * txt小说按照章节切割工具
 * 章节内容为
 * 第1章 原来一切都是阴谋
 * 第2章 还敢不要脸来退婚
 * 这种，占一行
 * 需要
 */
public class TxtSplitUtil {

    /**
     * 按章节切割txt小说
     * @param txtFilePath txt文件路径
     * @param chapterNum 每个文件章节数
     * @return 返回生成的txt文件路径数组
     *
     * 描述：根据小说Txt文件路径，每chapterNum个章节存储为一个txt文件，文件名以开始章节~结束章节.txt命名，在当前路径创建tmp文件夹，存储切割后的txt文件
     */
    public static String[] splitTxt(String txtFilePath, Integer chapterNum) {
        // 参数校验
        if (chapterNum == null || chapterNum <= 0) {
            throw new IllegalArgumentException("chapterNum must be a positive integer");
        }

        // 获取 txtFilePath 的父目录
        File parentDir = new File(txtFilePath).getParentFile();

        // 在父目录下创建文件夹
        // 提取文件名（不带扩展名）
        String inputFileName = new File(txtFilePath).getName();
        int dotIndex = inputFileName.lastIndexOf('.');
        if (dotIndex > 0) {
            inputFileName = inputFileName.substring(0, dotIndex);
        }

        // 创建以文件名命名的文件夹
        File tmpDir = new File(parentDir, inputFileName);
        if (!tmpDir.exists()) {
            tmpDir.mkdir();
        }

        // 定义章节正则匹配规则
        Pattern chapterPattern = Pattern.compile("第(\\d+)章\\s.*");

        // 当前章节内容
        StringBuilder currentChapterContent = new StringBuilder();
        int currentChapterCount = 0;
        int startChapter = 1;
        int endChapter = 0;

        // 获取章节总数
        int totalChaptersCnt = getTotalChapters(txtFilePath);
        String[] generatedFiles = new String[(int) Math.ceil(totalChaptersCnt / (double) chapterNum)];
        int fileIndex = 0;

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(txtFilePath), "GBK"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                Matcher matcher = chapterPattern.matcher(line);
                if (matcher.matches()) {
                    currentChapterCount++;
                    if (currentChapterCount > 1) {
                        endChapter = Integer.parseInt(matcher.group(1)) - 1;
                    }
                    if (currentChapterCount > chapterNum) {
                        // 写入文件
                        // 在写入文件时，使用 tmpDir 的绝对路径
                        String fileName = tmpDir.getAbsolutePath() + File.separator + startChapter + "~" + endChapter + ".txt";
                        writeToFile(fileName, currentChapterContent.toString());
                        generatedFiles[fileIndex++] = fileName;

                        // 重置状态
                        currentChapterContent = new StringBuilder();
                        currentChapterCount = 1;
                        startChapter = Integer.parseInt(matcher.group(1));
                    }
                }
                currentChapterContent.append(line).append("\n");
            }

            // 处理最后一组章节
            if (currentChapterCount > 0) {
                endChapter = startChapter + currentChapterCount - 1;
                // 在写入文件时，使用 tmpDir 的绝对路径
                String fileName = tmpDir.getAbsolutePath() + File.separator + startChapter + "~" + endChapter + ".txt";
                writeToFile(fileName, currentChapterContent.toString());
                generatedFiles[fileIndex] = fileName;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return generatedFiles;
    }

    /**
     * 获取总章节数
     * @param txtFilePath txt文件路径
     * @return 总章节数
     */
    private static int getTotalChapters(String txtFilePath) {
        int totalChapters = 0;
        Pattern chapterPattern = Pattern.compile("第\\d+章\\s.*");

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(txtFilePath), "GBK"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                if (chapterPattern.matcher(line).matches()) {
                    totalChapters++;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return totalChapters;
    }

    /**
     * 将内容写入文件
     * @param fileName 文件名
     * @param content 文件内容
     */
    private static void writeToFile(String fileName, String content) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
            writer.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
